import datetime

from info.utils.response_code import RET
from info.utils.captcha.captcha import captcha
from . import passport_blue
from flask import request, jsonify,current_app,make_response,session
from info import constants,db
from info import redis_store
import re
from info.models import User
import random
from info.libs.yuntongxun import sms,CCPRestSDK
from datetime import datetime
from datetime import datetime
print(redis_store)


@passport_blue.route("/image_code")
def generate_image_code():
    """

    :return:
    """
    image_code_id = request.args.get("image_code_id")
    if not image_code_id:
        return jsonify(errno=RET.PARAMERR,errmsg='参数缺失')
    name,text,image = captcha.generate_captcha()
    print(text)
    try:
        redis_store.setex("ImageCode_" + image_code_id,constants.IMAGE_CODE_REDIS_EXPIRES,text)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg='保存图片验证码失败')
    else:
        response = make_response(image)
        response.headers["Content-Type"] = "image/jpg"

        return response


@passport_blue.route("/sms_code",methods=["POST"])
def send_sms_code():
    """
    发送短信验证码
    当点击＂获得短信验证码时＂，后台将执行以下操作
    １　获得mobile image_code image_code_id(uuid) 三个参数，并校验三个参数及记录，返回前端错误
    ２　校验mobile格式，通过image_code_id获得redis中的image_code，并删除，与前端发来的数据对比
    ３　验证mobile是否注册过，通过mobile在mysql数据库中查找是否存在：
        user = User.query.filter(User.mobile==mobile).first()
    ４　通过＂％０６ｄ＂％random.randint()生成随机的６位数，保存
        redis_store.setex(名字，时间，内容)，
    ５　实例云通讯对象，调用其方法发送该随机码
        result = ccp.send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES/60],1)
    ６　判断result结果发送是否成功，返回信息给前端
    ７　

    :return:
    """
    mobile = request.json.get("mobile")
    image_code = request.json.get("image_code")
    image_code_id = request.json.get("image_code_id")
    print(mobile,"--------",image_code,"--------",image_code_id)
    if not all([mobile, image_code, image_code_id]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
    if not re.match(r"1[3456789]\d{9}$", mobile):
        return jsonify(errno=RET.PARAMERR,errmsg="手机格式不对")
    try:
        real_image_code = redis_store.get("ImageCode_" + image_code_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据库获取验证码失败")
    if not real_image_code:
        return jsonify(errno=RET.NODATA, errmsg="图片验证码已过期")
    try:
        redis_store.delete("ImageCode_" + image_code_id)
    except Exception as e:
        current_app.logger.error(e)

    if real_image_code.lower() != image_code.lower():
        return jsonify(errno=RET.DATAERR,errmsg="图片验证失败")
    try:
        user = User.query.filter(User.mobile==mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR,errmsg="查询用户信息失败")
    else:
        if user:
            return jsonify(errno=RET.DATAEXIST,errmsg="用户已经存在")
    sms_code = "%06d" % random.randint(0, 999999)
    try:
        redis_store.setex("smscode_"+mobile,constants.SMS_CODE_REDIS_EXPIRES,sms_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="短信数据存入失败")
    try:
        print(sms_code)
        ccp = sms.CCP()
        result = ccp.send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES/60],1)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg="发送短息异常")
    if result == 0:
        return jsonify(errno="0",errmsg="发送成功")
    else:
        return jsonify(errno=RET.THIRDERR,errmsg="发送短息异常")

@passport_blue.route("/register",methods=["POST"])
def register():
    """
    验证数据完成注册
    １　获得mobile sms_code password加密后的　
    ２　验证mobile sms_code 后删除短息验证码
    ３　实例用户对象，将其信息保存至mysql数据库
    ４　缓存用户信息至redis数据库，
    ５　返回前端告诉用户注册成功，
    ６　核实是否需要转到登陆页面？？？？

    :return:
    """
    mobile=request.json.get("mobile")
    sms_code = request.json.get("sms_code")
    password = request.json.get("password")# 需要加强保护，前端需要发送加密后的密码，而不是在存入数据库的时候再加密
    print(mobile,"===", sms_code,"===",password)
    if not all([mobile,sms_code,password]):
        return jsonify(errno=RET.PARAMERR,errmsg="参数不全")
    if not re.match(r"1[3456789]\d{9}$",mobile):
        return jsonify(errno=RET.PARAMERR,errmsg="手机号码格式不对")
    try:
        real_sms_code = redis_store.get("smscode_"+mobile)
        print(real_sms_code)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="读取数据库失败")
    print(real_sms_code)
    if not real_sms_code:
        return jsonify(errno=RET.DBERR,errmsg='读取的验证码为空值')
    if real_sms_code != sms_code:
        return jsonify(errno=RET.PARAMERR,errmsg="验证码输入错误")
    try:
        redis_store.delete("smscode_"+mobile)
    except Exception as e:
        current_app.logger.error(e)

    user = User()
    user.password = password  #调用加密方式，将密码加密存储

    user.mobile = mobile
    user.nick_name = mobile
    try:
        db.session.add(user)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DATAERR, errmsg="保存用户失败")
    session['user_id'] = user.id
    session['mobile'] = mobile
    session['nick_name'] = mobile
    # 返回结果
    return jsonify(errno=RET.OK, errmsg='注册成功')


@passport_blue.route("/login",methods=['POST'])
def login():
    """
    用户登陆／后端
    １　获得mobile password
    ２　校验完整性　mobile格式，数据库中用户是否存在
    ３　校验password，缓存用户信息，id nice_name image_url
    ４　返回登陆成功
    :return:
    """
    mobile = request.json.get("mobile")
    password = request.json.get("password")
    # print(mobile, password)
    if not all([mobile, password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
    if not re.match(r"1[3456789]\d{9}$", mobile):
        return jsonify(errno=RET.PARAMERR,errmsg="手机格式不对")
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg="数据读取错误")
    # if not user:
    #     return jsonify(errno=RET.DATAERR,errmsg="用户未注册")
    # if not user.check_password(password):
    if not user or not user.check_password(password):
        return jsonify(errno=RET.PARAMERR,errmsg="用户或密码错误")

    user.last_login = datetime.now()
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg="保存用户数据失败")
    # print(user.password_hash)
    session["user_id"] = user.id
    session["nick_name"] = user.nick_name
    session["mobile"] = user.mobile
    return jsonify(errno=RET.OK,errmsg="登陆成功")
@passport_blue.route("/logout")
def logout():
    """
    用户退出
   清楚用户缓存
    :return:
    """
    session.pop("user_id",None)
    session.pop("nick_name",None)
    session.pop("mobile",None)
    return jsonify(errno=RET.OK, errmsg='退出')